package io.renren.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import io.renren.controller.AbstractController;
import io.renren.dao.ActAssignDao;
import io.renren.dao.FybxDao;
import io.renren.dao.FybxDetDao;
import io.renren.entity.ActAssignEntity;
import io.renren.entity.FybxDetEntity;
import io.renren.entity.FybxEntity;
import io.renren.service.ActFlowService;
import io.renren.service.FybxService;
import io.renren.utils.ShiroUtils;
import io.renren.utils.StringUtils;
import io.renren.entity.*;
import io.renren.service.SysUploadService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.io.File;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import io.renren.dao.FybxDao;
import io.renren.service.FybxService;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;


@Transactional(propagation= Propagation.REQUIRED)
@Service("fybxService")
public class FybxServiceImpl extends AbstractController implements FybxService {
	@Autowired
	private FybxDao fybxDao;
	@Autowired
	private FybxDetDao fybxDetDao;
	@Autowired
	private ActFlowService actFlowService;
	@Autowired
	private ActAssignDao actAssignDao;

	@Autowired
	private SysUploadService sysUploadService;

	
	@Override
	public List<FybxEntity> queryList(Map<String, Object> map){
		return fybxDao.queryList(map);
	}
	
	@Override
	public int queryTotal(Map<String, Object> map){
		return fybxDao.queryTotal(map);
	}

	@Override
	public void delete(Integer bxId){
		fybxDao.delete(bxId);
	}
	
	@Override
	public void deleteBatch(Integer[] bxIds){
			for(int id: bxIds){
				FybxEntity fybxEntity = fybxDao.queryObject(id);
				List<SysUploadEntity> SysOssEntityList = sysUploadService.queryListByfileId(fybxEntity.getFileId());
				if(SysOssEntityList!=null&&SysOssEntityList.size()>0){
					for(SysUploadEntity list: SysOssEntityList){
						String url = list.getUrl();
						new File(url).delete();
					}
				}
				sysUploadService.deleteByfileId(fybxEntity.getFileId());
				List<FybxDetEntity> fybxDetEntitylist =  fybxDao.queryDetList(id);
				if(fybxDetEntitylist!=null&&fybxDetEntitylist.size()>0){
					for(FybxDetEntity list:fybxDetEntitylist){
						fybxDetDao.delete(list.getBxdetId());
					}
				}
			}
		fybxDao.deleteBatch(bxIds);
	}
	@Override
	public Map<String, Object> queryObject(Integer bxId){
		Map<String, Object> map = new HashMap<String, Object>();
				map.put("fybx",fybxDao.queryObject(bxId));
		List<FybxDetEntity> fybxDetList =  fybxDao.queryDetList(bxId);
		if(fybxDetList!=null&&fybxDetList.size()>0){
			map.put("fybxDetList",fybxDetList);
		}
		return map ;
	}
	@Override
	public void save(JSONObject params){
		FybxEntity fybxEntity =  params.getObject("fybx",FybxEntity.class);
		fybxEntity.setFileId(String.valueOf(new Date().getTime()));
		List<FybxDetEntity> FybxDetEntityList = JSON.parseArray(params.get("fybxDetList").toString(), FybxDetEntity.class);
		SysUserEntity user = (SysUserEntity) ShiroUtils.getSubject().getSession().getAttribute("user");

		fybxEntity.setCompanyId(user.getCompanyId());
		fybxEntity.setCusername(user.getUsername());
		fybxEntity.setDeptId(user.getDeptNo());
		fybxEntity.setCompany(user.getCompany());
		fybxEntity.setDept(user.getDept());
		fybxEntity.setUserdesc(user.getUserdesc());
		fybxEntity.setPost(user.getPost());

		fybxDao.save(fybxEntity);
		if(FybxDetEntityList!=null&&FybxDetEntityList.size()>0) {
			for (FybxDetEntity list : FybxDetEntityList) {
				list.setBxId(fybxEntity.getBxId());
				fybxDetDao.save(list);
			}
		}
	}

	@Override
	public void update(JSONObject params){
		FybxEntity fybxEntity =  params.getObject("fybx",FybxEntity.class);
		fybxDao.update(fybxEntity);
		List<FybxDetEntity> fybxDetEntitylist =  fybxDao.queryDetList(fybxEntity.getBxId());
		if(fybxDetEntitylist!=null&&fybxDetEntitylist.size()>0){
			for(FybxDetEntity list:fybxDetEntitylist){
				fybxDetDao.delete(list.getBxdetId());
			}
		}
			List<FybxDetEntity> FybxDetEntityList = JSON.parseArray(params.get("fybxDetList").toString(), FybxDetEntity.class);
			if(FybxDetEntityList!=null&&FybxDetEntityList.size()>0) {
				for (FybxDetEntity list : FybxDetEntityList) {
					list.setBxId(fybxEntity.getBxId());
					fybxDetDao.save(list);
				}
			}
	}


	@Override
	@Transactional
	public String submit(Integer bxId){
		FybxEntity entity=fybxDao.queryObject(bxId);
		Map<String,Object> map=new HashMap();
		map.put("processName","spmc07");//数据字段中spmc07代表报销
		String processName="spmc07";
		List<ActAssignEntity> listActAssign=actAssignDao.queryBYName(processName);
		if(listActAssign==null||listActAssign.size()==0){
			return "请在审批配置中配置审批条件！";
		}
		ActAssignEntity actAssign=listActAssign.get(0);
		Map mp=actFlowService.submitFlow(actAssign,entity,processName);
		if(mp.get("msg")!=null){
			String msg=mp.get("msg").toString();
			if(StringUtils.isNotBlank(msg)){
				return msg;
			}
		}
		entity=(FybxEntity)mp.get("obj");
		entity.setTjDate(new Date());
		fybxDao.update(entity);
		return "";
	}


	@Override
	@Transactional
	public void process(FybxEntity entity){
		Map<String, Object> map=new HashMap<>();
		map.put("piid",entity.getPiid());
		map.put("remark",entity.getRemark()==null?"":entity.getRemark());
		map.put("nextTo",entity.getNextTo());
		Object obj=actFlowService.saveFlow(map,entity,"agree","spmc07");
		entity=(FybxEntity)obj;
		fybxDao.update(entity);

	}

	@Override
	@Transactional
	public void reject(FybxEntity entity){

		Map<String, Object> map=new HashMap<>();
		map.put("piid",entity.getPiid());
		map.put("remark",entity.getRemark()==null?"":entity.getRemark());
		map.put("nextTo",entity.getNextTo());
		Object obj=actFlowService.saveFlow(map,entity,"reject","spmc07");
		entity=(FybxEntity)obj;
		entity.setPistatus("10");//设置为拒绝的状态
		fybxDao.update(entity);


	}


}
